import 'babel-polyfill'
import 'normalize.css/normalize.css' // A modern alternative to CSS resets
import '@/common/css/index.scss'

import Vue from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'
import ErrorPage from './views/404.vue'
import './element'
import { message as Message } from '@/element'
import echarts from 'echarts'

import './components'

import { checkToken } from '@/api/login'
import { getToken, removeUserInfo } from '@/utils/auth'

import filters from "@/utils/filters"
import '@/permission'

// VUE注册全局过滤器
Object.keys(filters).forEach(k => Vue.filter(k, filters[k]))

Vue.prototype.$echarts = echarts

// 初始化 vue
const init = function(error) {
  new Vue({
    el: '#app',
    router,
    store,
    render: h => h(error === false ? ErrorPage : App)
  })
}
// 获取本地缓存中的 token
const token = getToken()

let loginFlag = false

// 路由钩子函数，不能放在其他 router.js 文件中，由于统一平台文件引用混乱，放在 router.is 中会导致 store 或 router 报错
router.beforeEach((to, from, next) => {
  if (loginFlag || to.path === '/login' || to.path === '/register' || token) {
    next()
    return
  }
  if (!token && to.path !== '/login') {
    next({ path: '/login' })
  }
})

// 判断本地是否已经存在 token
if (token) {
  // 验证 token 是否过期
  checkToken(token).then(({ success }) => {
    // 失败，跳转登录页
    if (!success) {
      removeUserInfo()
      loginFlag = true
      window.location.href = '/login'
      return
    }
    init()
    // 成功，正常进入页面
  }).catch(() => {
    // 已过期，移除缓存的用户信息再进入页面
    removeUserInfo()
    Message({ type: 'error', showClose: true, message: 'token失效，请重新登录' })
    window.location.href = '/login'
  })
} else {
  init()
}

// 退出登录
window.eventBus = new Vue()
window.eventBus.$on('logout', () => {
  // 调用退出登录接口，成功跳转登录页，失败直接关闭页面
  store.dispatch('logout').then(() => {
    removeUserInfo()
    Message({ type: 'success', message: '注销成功' })
    setTimeout(() => {
      window.location.href = '/login'
    })
  }).catch(() => {
    Message({ type: 'success', message: '注销失败' })
  })
})
